//
//  InsuCore.js
//  SugLisSystem
//	计算保费保额
//  Created by Mr.Right on 2013-03-31.
//  Copyright 2013 Mr.Right. All rights reserved.
//	也许有天我老到走也走不到，但愿和你一起白首偕老❤~
var dB = require('untils/DB');
var exeSQL = require('untils/ExeSQL');
var pubFun = require('untils/PubFun');
var riskInfoHandler = require('suggest/RiskInfoHandler');
var tGlobalInput = require('GlobalInput');
/**
 * 计算保额
 * @param riskBaseItem 险种的具体信息
 * @param dutyCode 责任代码
 * */
function calAmnt(riskBaseItem, dutyCode) {
	//查询计算方向
	var LMDutyDB = new dB('LMDuty');
	LMDutyDB['dutycode'] = dutyCode;
	LMDutyDB.getInfo();
	var calFlag = LMDutyDB['calmode'];

	var sql = "select * from lmdutyget where getdutycode = (select getdutycode from LMDutyGetRela where dutycode='" + dutyCode + "')";
	var LMDutyGetDB = new dB('LMDutyGet');
	var LMDutyGetSchema = LMDutyGetDB.executeQuery(sql)[0];

	//趸交处理
	if (riskBaseItem.riskData['payintv'] == 0) {
		riskBaseItem.riskData['payendyear'] = 1000;
		riskBaseItem.riskData['payendyearflag'] = 'Y';
		riskBaseItem.riskData['payyears'] = 1;
	}

	//算法代码
	var calCode = '';
	if ('P' == calFlag) {
		// 保费算保额
		calCode = LMDutyGetSchema['calcode'];
	} else if ('G' == calFlag || 'I' == calFlag) {
		// 保额算保费，或者录入保额保费
		calCode = LMDutyGetSchema['cntercalcode'];
	} else if ('O' == calFlag) {
		// 其他因素算保额保费
		calCode = LMDutyGetSchema['othcalcode'];
	}

	var LMCalModeDB = new dB('LMCalMode');
	LMCalModeDB['calcode'] = calCode;
	LMCalModeDB.getInfo();
	var calSQL = LMCalModeDB['calsql'];
	calSQL = riskInfoHandler.TranseToTypical(calSQL, riskBaseItem);
	Ti.API.warn('[InsuCore]保额计算脚本：' + calSQL);
	var result = exeSQL.getOneValue(calSQL);
	if (result == '' || result == null) {
		result = 0;
	}

	if ('P' == calFlag && LMDutyGetSchema['zeroflag'] == 'N' && result == 0) {
		throw new Error("计算出来的保额不能为0.");
	}

	return Math.round(result * 100) / 100;
}

exports.calAmnt = calAmnt;

/**
 * 计算保费
 * @param riskBaseItem 险种的具体信息
 * @param dutyCode 责任代码
 * */
function calPrem(riskBaseItem, dutyCode) {
	//查询计算方向
	var LMDutyDB = new dB('LMDuty');
	LMDutyDB['dutycode'] = dutyCode;
	LMDutyDB.getInfo();
	var calFlag = LMDutyDB['calmode'];
	var sql = "select * from lmdutypay where payplancode = (select payplancode from LMDutyPayRela where dutycode='" + dutyCode + "')";
	var LMDutyPayDB = new dB('LMDutyPay');
	var LMDutyPaySchema = LMDutyPayDB.executeQuery(sql)[0];
	// 交费方式处理
	var payIntv = LMDutyPaySchema['payintv'];
	if (payIntv != -1) {
		// 固定缴费方式
		riskBaseItem.riskData['payintv'] = payIntv;
	}

	if (riskBaseItem.riskData['payintv'] == 0) {
		// 趸缴
		riskBaseItem.riskData['payendyear'] = 1000;
		riskBaseItem.riskData['payendyearflag'] = 'Y';
		riskBaseItem.riskData['payyears'] = 1;
	}

	//算法代码
	var calCode = '';
	if ('G' == calFlag) {
		// 保费算保额
		calCode = LMDutyPaySchema['calcode'];
	} else if ('P' == calFlag || 'I' == calFlag) {
		// 保额算保费，或者录入保额保费
		calCode = LMDutyPaySchema['cntercalcode'];
	} else if ('O' == calFlag) {
		// 其他因素算保额保费
		calCode = LMDutyPaySchema['othcalcode'];
	}

	var LMCalModeDB = new dB('LMCalMode');
	LMCalModeDB['calcode'] = calCode;
	LMCalModeDB.getInfo();
	var calSQL = LMCalModeDB['calsql'];
	calSQL = riskInfoHandler.TranseToTypical(calSQL, riskBaseItem);
	Ti.API.warn('[InsuCore]保费计算脚本：' + calSQL);
	var result = exeSQL.getOneValue(calSQL);
	if (result == '' || result == null) {
		result = 0;
	}
	//TODO 可增加豁免险的处理
	if (LMDutyPaySchema['zeroflag'] == 'N' && result == 0) {
		throw new Error("计算出来的保费不能为0.");
	}
	return Math.round(result * 100) / 100;
}

exports.calPrem = calPrem;

/**
 * 计算保费保额
 * */
function calcuteAmntAndPrem(riskBaseItem, flag) {
	var LMRiskDuty = new dB('LMRiskDuty');
	LMRiskDuty['riskcode'] = riskBaseItem.riskCode;
	var dutyCode = LMRiskDuty.query()[0]['dutycode'];
	//主要涉及附加险的处理，暂时未作主险处理
	preparePolInitData(riskBaseItem);
	try {
		dealPolData(riskBaseItem, dutyCode);
	} catch(e) {
	}

	//计算保额
	var get = 0;
	try {
		get = calAmnt(riskBaseItem, dutyCode);
	} catch(e) {
		Ti.API.error(['InsuCore'] + e);
	}
	riskBaseItem.riskData['amnt'] = get;
	riskBaseItem.riskData['get'] = get;

	//计算保费
	var prem = 0;
	try {
		prem = calPrem(riskBaseItem, dutyCode);
	} catch(e) {
		Ti.API.error(['InsuCore'] + e);
	}
	riskBaseItem.riskData['prem'] = prem;

	var reslut = 0;
	if ('CalAmnt' == flag) {
		reslut = get;
	} else if ('CalPrem' == flag) {
		reslut = prem;
	}
	return reslut;
}

exports.calcuteAmntAndPrem = calcuteAmntAndPrem;

/**
 * 计算保费保额，并保存至数据库
 * @param riskBaseItem 单一险种的信息
 * */
function calcutePol(riskBaseItem) {
	var LMRiskDuty = new dB('LMRiskDuty');
	LMRiskDuty['riskcode'] = riskBaseItem.riskCode;
	var dutyCode = LMRiskDuty.query()[0]['dutycode'];
	preparePolInitData(riskBaseItem);
	try {
		dealPolData(riskBaseItem, dutyCode);
	} catch(e) {
	}
	//计算保额
	var get = 0;
	try {
		get = calAmnt(riskBaseItem, dutyCode);
	} catch(e) {
		Ti.API.error('[InsuCore]' + e);
	}
	riskBaseItem.riskData['amnt'] = get;
	riskBaseItem.riskData['get'] = get;
	//计算保费
	var prem = 0;
	try {
		prem = calPrem(riskBaseItem, dutyCode);
	} catch(e) {
		Ti.API.error('[InsuCore]' + e);
	}
	riskBaseItem.riskData['prem'] = prem;
	//存入数据库
	savePolData(riskBaseItem);
}

exports.calcutePol = calcutePol;

/**
 * 准备处理一些险种数据
 * @param 险种数据
 * */
function preparePolInitData(riskBaseItem) {
	if (riskBaseItem.subRiskFlag == 'S') {
		var LMRiskParamDB = new dB('LMRiskParam');
		LMRiskParamDB['type'] = 'RelaToMainRisk';
		LMRiskParamDB['riskcode'] = riskBaseItem.riskCode;
		var LMRiskParamSet = LMRiskParamDB.query();
		var mainLSPolDB = new dB('LSPol');
		mainLSPolDB['polno'] = riskBaseItem.mainPolNo;
		if (mainLSPolDB.getInfo()) {
			for (var i = 0; i < LMRiskParamSet.length; i++) {
				var tempLMRiskParamSchema = LMRiskParamSet[i];
				var reslut = getDataFromMainPol(tempLMRiskParamSchema, mainLSPolDB);
				if (reslut == null || reslut == 'null' || reslut.toString() === '') {
					continue;
				}
				var param = tempLMRiskParamSchema['param'];
				// TODO 添加特殊险种的处理
				riskBaseItem.riskData[param.toLowerCase()] = reslut;
			}
		}
	}

	//从产品定义描述中获取险种保单数据
	var sql = "SELECT * FROM lmduty where dutycode in (select dutycode from lmriskduty where riskcode='" + riskBaseItem['riskCode'] + "')";
	var reLMDutyDB = new dB('LMDuty');
	var reLMDutySet = reLMDutyDB.executeQuery(sql);
	var reLMDutySchema = reLMDutySet[0];

	// 责任代码
	riskBaseItem.riskData['dutycode'] = reLMDutySchema['dutycode'];
	riskBaseItem.riskData['vpu'] = reLMDutySchema['vpu'];

	// 保险期间
	var flag = reLMDutySchema['insuyearrela'];
	if (flag == '4') {
		riskBaseItem.riskData['insuyear'] = reLMDutySchema['insuyear'];
		riskBaseItem.riskData['insuyearflag'] = reLMDutySchema['insuyearflag'];
	}
	// 缴费期间
	flag = reLMDutySchema['payendyearrela'];
	if (flag == '4') {
		riskBaseItem.riskData['payendyear'] = reLMDutySchema['payendyear'];
		riskBaseItem.riskData['payendyearflag'] = reLMDutySchema['payendyearflag'];
	}
	// 起领期间
	flag = reLMDutySchema['getyearrela'];
	if (flag == '4') {
		riskBaseItem.riskData['getyear'] = reLMDutySchema['getyear'];
		riskBaseItem.riskData['getyearflag'] = reLMDutySchema['getyearflag'];
	}
}

/**
 * 对于保单数据进行逻辑加工，主要3个期间，2个年期
 * @param polElementSchema
 * @param dutyCode 责任编码
 */
function dealPolData(riskBaseItem, dutyCode) {
	var LMDutyDB = new dB('LMDuty');
	LMDutyDB['dutycode'] = dutyCode;
	if (LMDutyDB.getInfo()) {
		// 保险期间
		var flag = LMDutyDB['insuyearrela'];
		if (flag == '1') {
			// 和缴费终止期间的值相同
			riskBaseItem.riskData['insuyear'] = riskBaseItem.riskData['payendyear'];
			riskBaseItem.riskData['insuyearflag'] = riskBaseItem.riskData['payendyearflag'];
		} else if (flag == '2') {
			// 和起领期间的值相同
			riskBaseItem.riskData['insuyear'] = riskBaseItem.riskData['getyear'];
			riskBaseItem.riskData['insuyearflag'] = riskBaseItem.riskData['getyearflag'];
		}
		// 缴费期间
		flag = LMDutyDB['payendyearrela'];
		if (flag == '2') {
			// 和起领期间的值相同
			riskBaseItem.riskData['payendyear'] = riskBaseItem.riskData['getyear'];
			riskBaseItem.riskData['payendyearflag'] = riskBaseItem.riskData['getyearflag'];
		} else if (flag == '3') {
			// 和保险期间的值相同
			riskBaseItem.riskData['payendyear'] = riskBaseItem.riskData['insuyear'];
			riskBaseItem.riskData['payendyearflag'] = riskBaseItem.riskData['insuyearflag'];
		}
		// 起领期间
		flag = LMDutyDB['getyearrela'];
		if (flag == '1') {
			// 和缴费终止期间的值相同
			riskBaseItem.riskData['getyear'] = riskBaseItem.riskData['payendyear'];
			riskBaseItem.riskData['getyearflag'] = riskBaseItem.riskData['payendyearflag'];
		} else if (flag == '3') {
			// 和保险期间的值相同
			riskBaseItem.riskData['getyear'] = riskBaseItem.riskData['insuyear'];
			riskBaseItem.riskData['getyearflag'] = riskBaseItem.riskData['insuyearflag'];
		}
		// 计算保险年期
		var years = 0;
		if (riskBaseItem.insuSchema['age'] == null) {
			riskBaseItem.insuSchema['age'] = pubFun.calInterval(riskBaseItem.insuSchema['birthday'], pubFun.getCurrentDate(), 'Y');
		}
		if (riskBaseItem.riskData['insuyearflag'] == 'Y') {
			years = riskBaseItem.riskData['insuyear'];
		} else if (riskBaseItem.riskData['insuyearflag'] == 'A') {
			years = riskBaseItem.riskData['insuyear'] - riskBaseItem.insuSchema['age'];
		}
		riskBaseItem.riskData['years'] = years;

		// 计算缴费年期
		var payyears = 0;
		if (riskBaseItem.riskData['payendyearflag'] == 'Y') {
			payyears = riskBaseItem.riskData['payendyear'];
		} else if (riskBaseItem.riskData['payendyearflag'] == 'A') {
			payyears = riskBaseItem.riskData['payendyear'] - riskBaseItem.insuSchema['age'];
		}
		riskBaseItem.riskData['payyears'] = payyears;
	}
}

/**
 * 保存保单数据，无论结果如何
 * @param riskBaseItem 险种数据
 * */
function savePolData(riskBaseItem) {
	//增加一些数据
	//0.Pol表不为空的数据
	riskBaseItem.riskData['grpcontno'] = '000000';
	riskBaseItem.riskData['grppolno'] = '000000';
	riskBaseItem.riskData['proposalno'] = '000000';
	riskBaseItem.riskData['prtno'] = riskBaseItem.contNo;
	//1.险种主键信息
	riskBaseItem.riskData['polno'] = riskBaseItem.polNo;
	riskBaseItem.riskData['contno'] = riskBaseItem.contNo;
	riskBaseItem.riskData['mainpolno'] = riskBaseItem.mainPolNo;
	riskBaseItem.riskData['riskcode'] = riskBaseItem.riskCode;
	riskBaseItem.riskData['subflag'] = riskBaseItem.subRiskFlag;
	//2.投保人数据
	riskBaseItem.riskData['appntno'] = riskBaseItem.appntSchema['appntno'];
	riskBaseItem.riskData['appntname'] = riskBaseItem.appntSchema['appntname'];
	//3.被保人信息
	riskBaseItem.riskData['insuredno'] = riskBaseItem.insuSchema['insuredno'];
	riskBaseItem.riskData['insuredname'] = riskBaseItem.insuSchema['name'];
	riskBaseItem.riskData['insuredsex'] = riskBaseItem.insuSchema['sex'];
	riskBaseItem.riskData['insuredbirthday'] = riskBaseItem.insuSchema['birthday'];
	if (riskBaseItem.insuSchema['age'] == null) {
		riskBaseItem.insuSchema['age'] = pubFun.calInterval(riskBaseItem.insuSchema['birthday'], pubFun.getCurrentDate(), 'Y');
	}
	riskBaseItem.riskData['insuredappage'] = riskBaseItem.insuSchema['age'];
	riskBaseItem.riskData['occupationtype'] = riskBaseItem.insuSchema['occupationcode'];
	//4.操作员信息
	riskBaseItem.riskData['agentcode'] = tGlobalInput['Operator'];
	riskBaseItem.riskData['agentgroup'] = tGlobalInput['ComCode'];
	riskBaseItem.riskData['operator'] = tGlobalInput['Operator'];
	riskBaseItem.riskData['salechnl'] = '1';
	//5.修改创建信息
	var currentDate = pubFun.getCurrentDate();
	var currentTime = pubFun.getCurrentTime();
	if (pubFun.isNull(riskBaseItem.riskData['makedate'])) {
		riskBaseItem.riskData['makedate'] = currentDate;
	}
	if (pubFun.isNull(riskBaseItem.riskData['maketime'])) {
		riskBaseItem.riskData['maketime'] = currentTime;
	}
	riskBaseItem.riskData['modifydate'] = currentDate;
	riskBaseItem.riskData['modifytime'] = currentTime;
	//6.数据的特殊处理
	if (pubFun.isNull(riskBaseItem.riskData['mult'])) {
		riskBaseItem.riskData['mult'] = '1';
	}
	var standPrem = 0;
	try {
		standPrem = riskBaseItem.riskData['prem'] * riskBaseItem.riskData['payintv'] / 12;
	} catch(e) {
		standPrem = 0;
	}
	riskBaseItem.riskData['standprem'] = standPrem;
	riskBaseItem.riskData['sumprem'] = riskBaseItem.riskData['prem'];
	riskBaseItem.riskData['riskamnt'] = riskBaseItem.riskData['amnt'];
	var LSPolDB = new dB('LSPol');
	LSPolDB.setSchema(riskBaseItem.riskData);
	LSPolDB.insert();
}

/**
 * 动态计算结果
 * 主附险中之间关系
 * @param LMRiskParamSchema 需要计算的参数
 * @param mainLSPolShcema 参数数据
 * */
function getDataFromMainPol(LMRiskParamSchema, mainLSPolShcema) {
	var expression = LMRiskParamSchema['expression'];
	var AppAge = mainLSPolShcema['insuredappage']
	var Amnt = mainLSPolShcema['amnt'];
	var Get = mainLSPolShcema['amnt'];
	var Prem = mainLSPolShcema['prem'];
	var Mult = mainLSPolShcema['mult'];
	var PayIntv = mainLSPolShcema['payintv'];
	var InsuYear = mainLSPolShcema['insuyear'];
	var InsuYearFlag = mainLSPolShcema['insuyearflag'];
	var PayEndYear = mainLSPolShcema['payendyear'];
	var PayEndYearFlag = mainLSPolShcema['payendyearflag'];
	var LiveGetMode = mainLSPolShcema['livegetmode'];
	var BonusGetMode = mainLSPolShcema['bonusgetmode'];
	var StandbyFlag1 = mainLSPolShcema['standbyflag1'];
	var StandbyFlag2 = mainLSPolShcema['standbyflag2'];
	var StandbyFlag3 = mainLSPolShcema['standbyflag3'];
	var MainRiskCode = mainLSPolShcema['riskcode'];
	return eval(expression);
}
